package model

import (
	"fmt"
	"github.com/jinzhu/gorm"                  //导入orm关系映射
	_ "github.com/jinzhu/gorm/dialects/mysql" //导入mysql驱动连接
	"github.com/spf13/viper"
)

/*
之前连接数据库的时候，会直接写sql语句；

orm：对象关系映射
gin通过orm对象映射到数据库中，不需要和复杂的sql语句打交道，只需要简单的操作对象的属性和方法
*/

// 连接数据库
func OpenDB() *gorm.DB {
	//连接数据库的url地址
	config := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=%t&loc=%s", //格式化
		viper.GetString("db.username"),
		viper.GetString("db.password"),
		viper.GetString("db.addr"),
		viper.GetString("db.name"),
		true,
		"Local",
	)
	//config -->
	//bysyweb:bysyweb123@tcp(192.168.2.121)/bysyweb?charset=utf8&paraseTime=true&loc=Local
	db, err := gorm.Open("mysql", config)
	if err != nil {
		fmt.Println("Database connection faild.", err)
	}
	fmt.Println("Database connection success!", db)
	return db
}

// 创建一个可以保存多个数据库连接的结构体
type Database struct {
	Self *gorm.DB
	//docker *gorm.DB
}

var DB *Database

func (db *Database) Init() {
	DB = &Database{
		Self: OpenDB(),
	}
	//automigrate  自动将程序定义好的数据模型 迁移到数据库，生效到数据库
	DB.Self.AutoMigrate(&Author{}, &Article{}, &ArticleType{}, &ApiAuth{})
}

// 关闭数据库
func (db *Database) Close() {
	DB.Self.Close()
	//DB.docker.Close()
}
